iT邦幫忙

2025 iThome 鐵人賽

DAY 19
0

quarkus 作為一個和雲端服務整合度很高的後端框架

裡面也有很多的套件可以協助後端和雲端服務進行整合

我們先安裝 quarkus 裡面和 kubernetes 相關的幾個套件

    implementation 'io.quarkus:quarkus-kubernetes'
    implementation 'io.quarkus:quarkus-smallrye-health'
    implementation 'io.quarkus:quarkus-kubernetes-config'

安裝好之後,我們運行

gradle build

運作完畢之後,可以看到在 build/kubernetes/kubernetes.yml 裡面,已經有建立好的 k8s 腳本了

---
apiVersion: v1
kind: ServiceAccount
metadata:
  annotations:
    app.quarkus.io/quarkus-version: 3.24.2
    app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
    app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
    app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
  labels:
    app.kubernetes.io/name: quarkus2025
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
    app.kubernetes.io/managed-by: quarkus
  name: quarkus2025
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    app.kubernetes.io/name: quarkus2025
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
  name: quarkus2025-view
roleRef:
  kind: ClusterRole
  apiGroup: rbac.authorization.k8s.io
  name: view
subjects:
  - kind: ServiceAccount
    name: quarkus2025
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    app.quarkus.io/quarkus-version: 3.24.2
    app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
    app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
    app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
  labels:
    app.kubernetes.io/name: quarkus2025
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
    app.kubernetes.io/managed-by: quarkus
  name: quarkus2025
spec:
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app.kubernetes.io/name: quarkus2025
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    app.quarkus.io/quarkus-version: 3.24.2
    app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
    app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
    app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
  labels:
    app.kubernetes.io/name: quarkus2025
    app.kubernetes.io/version: 1.0.0-SNAPSHOT
    app.kubernetes.io/managed-by: quarkus
  name: quarkus2025
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: quarkus2025
      app.kubernetes.io/version: 1.0.0-SNAPSHOT
  template:
    metadata:
      annotations:
        app.quarkus.io/quarkus-version: 3.24.2
        app.quarkus.io/commit-id: 2fdfe2d27eab14a683174c2dceb1997f00c88252
        app.quarkus.io/vcs-uri: https://github.com/flamerecca/quarkus2025.git
        app.quarkus.io/build-timestamp: 2025-09-20 - 15:18:55 +0000
      labels:
        app.kubernetes.io/managed-by: quarkus
        app.kubernetes.io/name: quarkus2025
        app.kubernetes.io/version: 1.0.0-SNAPSHOT
    spec:
      containers:
        - env:
            - name: KUBERNETES_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          image: docker.io/reccachao/hello-quarkus:1.0.0-SNAPSHOT
          imagePullPolicy: Always
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /q/health/live
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          name: quarkus2025
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /q/health/ready
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
          startupProbe:
            failureThreshold: 3
            httpGet:
              path: /q/health/started
              port: 8080
              scheme: HTTP
            initialDelaySeconds: 5
            periodSeconds: 10
            successThreshold: 1
            timeoutSeconds: 10
      serviceAccountName: quarkus2025

另外,當我們運作專案時

quarkus dev

會看到在 http://127.0.0.1:8080/q/health/live 已經由套件建立好

{
    "status": "UP",
    "checks": [
    ]
}

還有 http://127.0.0.1:8080/q/health/ready

{
    "status": "UP",
    "checks": [
        {
            "name": "Database connections health check",
            "status": "UP",
            "data": {
                "<default>": "UP"
            }
        }
    ]
}

這些地方搭配上 k8s 的功能,後面可以讓佈署容器化服務變得更加簡單便利,是 quarkus 框架一個很獨特的優勢。

和 ktor 的比較

說了這麼多 quarkus 的特點,那麼和 ktor 相比,該在什麼時候選擇哪個框架呢?

我認為如果是已知會有高可用性的需求,並且團隊內對於 k8s 已經有一定熟悉程度時,可以透過建立 k8s 腳本搭配 quarkus 框架,來達成多個容器的服務。避免單一容器出現問題時造成用戶無法使用功能的問題。

但是,如果目前服務相對單純,並沒有那麼多的容器需要進行管理,那麼引入 k8s 反而會讓專案維護的複雜度提高。

如果沒有使用 k8s,只是單純建立幾個容器的話,那麼 quarkus 和 Ktor 比較的優點就沒有那麼突出了。這時候我就會選擇使用 Ktor 或其他的後端框架。

今天的部分就到這邊,我們明天見!


上一篇
Day 18:Quarkus 的特性和搭配的 ORM
下一篇
Day 20:Ktor 的文件和教學
系列文
每天一點 Ktor 3.0:一個月學會 Kotlin 後端開發20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言